# 这是一个示例 Python 脚本。

# 按 Shift+F10 执行或将其替换为您的代码。
# 按 双击 Shift 在所有地方搜索类、文件、工具窗口、操作和设置。


from sqlalchemy import Column, Integer, String, Text, DateTime, Date
from sqlalchemy import create_engine, UniqueConstraint, Index, ForeignKey, MetaData, Table
from sqlalchemy.orm import declarative_base
from sqlalchemy.orm import sessionmaker, scoped_session

#
engine = create_engine(
    "postgresql+psycopg2://postgres:12345678@127.0.0.1/dw",
    max_overflow=0,  # 超过连接池大小外最多创建的链接数
    pool_size=20,  # 连接池大小
    pool_timeout=30,  # 连接池中没有线程最多等待时间，否则报错
    pool_recycle=1,  # 多久之后对连接池中的连接进行回收（重置） -1 不回收
    echo=True,
    client_encoding='utf8'
)

# 创建基类
ORMBase = declarative_base()

# 每次执行数据库操作的时候，都需要创建一个Session ，相当于管理器（相当于Django 的ORM 的objects )
Session = sessionmaker(bind=engine)
# 线程安全， 基于本地线程实现每个线程用同一个session
current_session = scoped_session(Session)

# 实例化(相当于 实现了一个单例模式）
dbSession = current_session()

# 通过engine 获得 conn ,
connection = engine.raw_connection()
#
cursor = connection.cursor()


# 定义用户模型
class User(ORMBase):
    # __tablename__ 属性将映射到数据库中的user 表，  表名称
    __tablename__ = "users"
    # 在此处添加约束， 如 索引Index 或联合索引，
    __table_args__ = (

    )

    id = Column(Integer, primary_key=True)

    name = Column(String(50), nullable=False)


class User2(ORMBase):
    # __tablename__ 属性将映射到数据库中的user 表，  表名称
    __tablename__ = "user2"

    id = Column(String(50), nullable=True)

    def __repr__(self):
        return f"<User(name={self.name}, age={self.age} )>"


# 在数据库中创建表
ORMBase.metadata.create_all(engine)


def print_hi(name):
    # 在下面的代码行中使用断点来调试脚本。
    print(f'Hi, {name}')  # 按 Ctrl+F8 切换断点。


# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':
    print_hi('PyCharm')

# 访问 https://www.jetbrains.com/help/pycharm/ 获取 PyCharm 帮助
